﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ForeachIterationIndex
{
    class Program
    {
        static void Main(string[] args)
        {
            var usuarios = Usuario.Listar();
            var clientes = Cliente.Listar();

            Console.WriteLine("=========== 1. USANDO UN CONTADOR ===========");
            int c = 0;
            foreach (var usuario in usuarios)
            {
                Console.WriteLine(c);
                c++;
            }

            Console.WriteLine("=========== 2. USANDO SYSTEM.LINQ EN CLASS ===========");
            foreach (var usuario in usuarios.Where(x => x.Nombre.ToLower().Contains("a")))
                Console.WriteLine(usuarios.IndexOf(usuario));

            Console.WriteLine("=========== 3. USANDO SYSTEM.LINQ Y UNA FUNCION EN CLASS ===========");
            foreach (var usuario in usuarios.Where(x => x.Nombre.ToLower().Contains("a")))
            {
                var usuarioProcesado = CalcularEdad(usuario);
                Console.WriteLine(usuarios.IndexOf(usuarioProcesado) + " - " + usuarioProcesado.Edad);
            }

            Console.WriteLine("=========== 4. USANDO SYSTEM.LINQ EN STRUCT ===========");
            foreach (var cliente in clientes.Where(x => x.Nombre.ToLower().Contains("a")))
                Console.WriteLine(clientes.IndexOf(cliente));

            Console.WriteLine("=========== 5. USANDO SYSTEM.LINQ Y UNA FUNCION EN STRUCT ===========");
            foreach (var cliente in clientes.Where(x => x.Nombre.ToLower().Contains("a")))
            {
                var clienteProcesado = CalcularEdad(cliente);
                Console.WriteLine(clientes.IndexOf(clienteProcesado) + " - " + clienteProcesado.Edad);
            }
        }

        static Usuario CalcularEdad(Usuario usuario) 
        {
            usuario.Edad = (int)((DateTime.Now - usuario.FechaNacimiento).TotalDays / 365);
            return usuario;
        }

        static Cliente CalcularEdad(Cliente cliente)
        {
            cliente.Edad = (int)((DateTime.Now - cliente.FechaNacimiento).TotalDays / 365);
            return cliente;
        }
    }

    public class Usuario
    {
        public string Nombre { get; set; }

        public int Edad { get; set; }

        public DateTime FechaNacimiento { get; set; }

        public static List<Usuario> Listar() 
        {
            return new List<Usuario> 
            {
                new Usuario { Nombre = "Atom", FechaNacimiento = DateTime.Now.AddYears(-12) },
                new Usuario { Nombre = "Bolt", FechaNacimiento = DateTime.Now.AddYears(-15) },
                new Usuario { Nombre = "Carmen", FechaNacimiento = DateTime.Now.AddYears(-18) },
                new Usuario { Nombre = "Phineas", FechaNacimiento = DateTime.Now.AddYears(-21) },
                new Usuario { Nombre = "Lawliet", FechaNacimiento = DateTime.Now.AddYears(-24) },
            };
        }
    }

    public struct Cliente
    {
        public string Nombre { get; set; }

        public int Edad { get; set; }

        public DateTime FechaNacimiento { get; set; }

        public static List<Cliente> Listar()
        {
            return new List<Cliente> 
            {
                new Cliente { Nombre = "Atom", FechaNacimiento = DateTime.Now.AddYears(-12) },
                new Cliente { Nombre = "Bolt", FechaNacimiento = DateTime.Now.AddYears(-15) },
                new Cliente { Nombre = "Carmen", FechaNacimiento = DateTime.Now.AddYears(-18) },
                new Cliente { Nombre = "Phineas", FechaNacimiento = DateTime.Now.AddYears(-21) },
                new Cliente { Nombre = "Lawliet", FechaNacimiento = DateTime.Now.AddYears(-24) },
            };
        }
    }
}
